/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import modelo.Usuarios;

/**
 *
 * @author Felipe
 */
public class UsuarioDAO {

    private Connection conexion;

    public Connection getConexion() {
        return conexion;
    }

    public void setConexion(Connection conexion) {
        this.conexion = conexion;
    }

    /**
     * ejecuta sentencia SQL y el resultado lo convierte en Objeto
     *
     * @param rut
     * @return Productos
     */
    public Usuarios buscar(int rut) {
        Usuarios registro = null;
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            String sql = "select *  from USUARIOS where RUT_USUARIO = ?"; // idx :1
            sentencia = conexion.prepareStatement(sql);
            sentencia.setInt(1, rut);
            resultado = sentencia.executeQuery();

            if (resultado.next()) {
                registro = new Usuarios();

                registro.setRutUsuario(resultado.getInt("RUT_USUARIO"));
                registro.setNombre(resultado.getString("NOMBRE"));
                registro.setApellido(resultado.getString("APELLIDO"));
                registro.setTelefono(resultado.getString("TELEFONO"));
                registro.setPass(resultado.getString("PASS"));
                registro.setEstado(resultado.getInt("ESTADO"));
                registro.setPrivilegios(resultado.getInt("PRIVILEGIOS"));
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("ProductoDAO.buscar: " + rut, ex);
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return registro;
    }
    
    public Usuarios loquearse(int rut) {
        Usuarios registro = null;
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            String sql = "select *  from USUARIOS where RUT_USUARIO = ? and ESTADO = ?"; // idx :1
            sentencia = conexion.prepareStatement(sql);
            sentencia.setInt(1, rut);
            sentencia.setInt(2,1);
            
            resultado = sentencia.executeQuery();

            if (resultado.next()) {
                registro = new Usuarios();

                registro.setRutUsuario(resultado.getInt("RUT_USUARIO"));
                registro.setNombre(resultado.getString("NOMBRE"));
                registro.setApellido(resultado.getString("APELLIDO"));
                registro.setTelefono(resultado.getString("TELEFONO"));
                registro.setPass(resultado.getString("PASS"));
                registro.setEstado(resultado.getInt("ESTADO"));
                registro.setPrivilegios(resultado.getInt("PRIVILEGIOS"));
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("UsuarioDAO.loquearse: " + rut, ex);
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return registro;
    }

    public Collection<Usuarios> buscarTodos() {
        Collection<Usuarios> lista = new ArrayList<Usuarios>();
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            String sql = "select * from USUARIOS";
            sentencia = conexion.prepareStatement(sql);
            resultado = sentencia.executeQuery();
            try {
                while (resultado.next()) {
                    Usuarios registro = new Usuarios();

                    registro.setRutUsuario(resultado.getInt("RUT_USUARIO"));
                    registro.setNombre(resultado.getString("NOMBRE"));
                    registro.setApellido(resultado.getString("APELLIDO"));
                    registro.setTelefono(resultado.getString("TELEFONO"));
                    registro.setPass(resultado.getString("PASS"));
                    registro.setEstado(resultado.getInt("ESTADO"));
                    registro.setPrivilegios(resultado.getInt("PRIVILEGIOS"));

                    // finalmente, agregar a la coleccion
                    lista.add(registro);
                }
            } catch (NullPointerException ex) {
                return null;

            }

        } catch (SQLException ex) {
            //TODO Gestionar mejor esta exception
            ex.printStackTrace();
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return lista;
    }

    public void Insertar(Usuarios usu) {
        PreparedStatement sentencia = null;

        try {
            
            String nombre = usu.getNombre();
            String apellido = usu.getApellido();
            int privilegios = usu.getPrivilegios();
            String telefono = usu.getTelefono();
            String pass = usu.getPass();
            int estado = 1;
            int rutUsuario = usu.getRutUsuario();
            
            
            String sql = "insert into  USUARIOS (RUT_USUARIO,NOMBRE,APELLIDO,PASS,TELEFONO,ESTADO,PRIVILEGIOS) values(?,?,?,?,?,?,?)";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setInt(1, rutUsuario);
            sentencia.setString(2, nombre);
            sentencia.setString(3, apellido);
            sentencia.setString(4, pass);
            sentencia.setString(5, telefono);            
            sentencia.setInt(6, estado);
            sentencia.setInt(7, privilegios);

            
            sentencia.executeUpdate();

//          sentencia.executeUpdate(sql);
        } catch (SQLException ex) {
            //TODO Gestionar mejor esta exception
            ex.printStackTrace();
        } finally {
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }

        }

    }

    public int eliminar(int codigo)  {
        int filas = 0;
        PreparedStatement sentencia = null;
        try {
            String sql = "UPDATE USUARIOS set ESTADO = ? where RUT_USUARIO = ?";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setInt(1, 0);
            sentencia.setInt(2, codigo);
            filas = sentencia.executeUpdate();

        } catch (SQLException ex) {

        }
        return filas;
    }

    public int modificar(Usuarios usu) {
        PreparedStatement sentencia = null;
        int filas =0;
        try {
            String nombre = usu.getNombre();
            String apellido = usu.getApellido();
            int privilegios = usu.getPrivilegios();
            String telefono = usu.getTelefono();
            String pass = usu.getPass();
            int estado = usu.getEstado();
            int rutUsuario = usu.getRutUsuario();

            String sql = "UPDATE USUARIOS set NOMBRE = ?, APELLIDO = ?, TELEFONO = ?, PRIVILEGIOS =?, PASS = ?, ESTADO = ? where RUT_USUARIO = ?";
            sentencia = conexion.prepareStatement(sql);
            
            sentencia.setString(1, nombre);
            sentencia.setString(2, apellido);
            sentencia.setString(3, telefono);
            sentencia.setInt(4, privilegios);
            sentencia.setString(5, pass);
            sentencia.setInt(6, estado);
            sentencia.setInt(7, rutUsuario);

            filas = sentencia.executeUpdate();
            
        } catch (SQLException ex) {
            //TODO Gestionar mejor esta exception
            ex.printStackTrace();
        } finally {
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
                
            }

        }
        return filas;
    }
    
    public int modificarClave(int rut,String pass) {
        PreparedStatement sentencia = null;
        int filas =0;
        try {
            
            String sql = "UPDATE USUARIOS set  PASS = ? where RUT_USUARIO = ?";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setString(1, pass);
            sentencia.setInt(2, rut);

            filas = sentencia.executeUpdate();
            
        } catch (SQLException ex) {
            throw new RuntimeException("no se puede cambiar la clave", ex);
        } finally {
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
                
            }

        }
        return filas;
    }

    Usuarios buscarPorNombre(String nombre) {
        PreparedStatement sentencia = null;
        Usuarios registro = null;
        ResultSet resultado = null;
        try {
            String sql = "select *  from PRODUCTOS where NOMBRE = ?";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setString(1, nombre);
            sentencia.executeQuery();
            if (resultado.next()) {
                registro = new Usuarios();

                registro.setRutUsuario(resultado.getInt("RUT_USUARIO"));
                registro.setNombre(resultado.getString("NOMBRE"));
                registro.setApellido(resultado.getString("APELLIDO"));
                registro.setTelefono(resultado.getString("TELEFONO"));
                registro.setPass(resultado.getString("PASS"));
                registro.setEstado(resultado.getInt("ESTADO"));
                registro.setPrivilegios(resultado.getInt("PRIVILEGIOS"));

            }

        } catch (SQLException ex) {

        }
        return registro;

    }

    Collection<Usuarios> operadores() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    int administradores() {
        int count = 1;
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            String sql =  "SELECT COUNT(RUT_USUARIO) AS CONT FROM USUARIOS WHERE PRIVILEGIOS = 2";
            sentencia = conexion.prepareStatement(sql);
            resultado = sentencia.executeQuery();
            if (resultado.next()){
            count = resultado.getInt("CONT");
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("no se obtuvo la cantidad de admins ", ex);
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return count ;
    

    }

}
